[C] Rotação de Bits
Publicado por Enzo de Brito Ferber (última atualização em 11/07/2017)
[ Hits: 10.221 ]
Homepage: http://www.maximasonorizacao.com.br
Download rotate_bits.c (versão 2)
Programa com uma função de rotação de bits.
Exemplo:
rotatebits( 0010, 1, LEFT ) = 0100
rotatebits( 0100, 1, RIGHT ) = 0010
rotatebits( 0100, 2, LEFT ) = 0001
....
O código está todo em inglês porque aqui não será o único lugar que vou publicar, aí não traduzi... :P
Versão 2 - Enviado por Enzo de Brito Ferber em 22/06/2017
Changelog: Novo algoritmo usando apenas bitwise para rotações.
/* rotatebits.c * * Enzo Ferber : <enzo@veloxmail.com.br> * sep 2010 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define LEFT 1 #define RIGHT 2 /* number of binary digits */ #define BINDIGS 8 /* friendly definitions */ #define BITMASK 0x80 #define LASTBIT 0x80 #define FIRSTBIT 0x01 /* printbin(n) * * prints 'n' in binary form */ void printbin( int n ) { register int i; for( i = 0; i < BINDIGS; i++ ) printf( "%c", (( n & (BITMASK >> i)) ? '1' : '0') ); return ; } /* rotatebits( x, n, d ) * * x - number to rotate * n - n jumps * d - direction ( LEFT, RIGHT ) */ int rotatebits( int x, int n, int d ) { register int i; unsigned bit; for( i = 0; i < n; i++ ) { bit = ( d == LEFT ) ? LASTBIT : FIRSTBIT; /* saves the bit that will be lost in the shift */ bit = x & bit; /* shifts the number */ x = ( d == LEFT ) ? x << 1 : x >> 1; /* reset the lost bit in the other end of the number */ x |= ( bit ? ((d == LEFT) ? FIRSTBIT : LASTBIT ) : 0x00 ); } /* returns the new number rotated */ return x; } /* just to fool around a little bit... */ int main( int argc, char *argv[] ) { register int i, j, x; if( argc < 2 ) { printf( "Usage: %s <num1> (num2)...\n", argv[0] ); printf( "[*] At least one number must be given...\n" ); exit( 0 ); } for( j = 1; j < argc; j++ ) { for( i = 0; i <= BINDIGS; i++ ) { x = rotatebits( atoi( argv[j] ), i , LEFT); printf( "left( %d, %d ) : ", atoi( argv[j] ), i ); printbin( x ); printf( "\t\t" ); x = rotatebits( atoi( argv[j] ), i , RIGHT); printf( "right( %d, %d ): ", atoi( argv[j] ), i ); printbin( x ); puts( "" ); } puts( "\n" ); } return 0; }
Busca, inserção e remoção de elementos numa lista
Sistema básico de cadastro usando Listas Encadeadas
Ponteiro para Ponteiro para Ponteiro
Tipos de Dados Abstrato - TDA - Números Complexos
Instalar e Configurar o Slackware Linux em 2025
Como configurar os repositórios do apt no Debian 12 em 2025
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Configurando o Conky para iniciar corretamente no sistema
3 configurações básicas que podem melhorar muito a sua edição pelo editor nano
Como colorir os logs do terminal com ccze
Instalação Microsoft Edge no Linux Mint 22
Como configurar posicionamento e movimento de janelas no Lubuntu (Openbox) com atalhos de teclado
Novo problema! Erro durante a atualização! (6)
Linux Mint não conecta Wi-Fi sem fio (1)
Tenho um problama de quebra de pacote e não descobri como resolver [RE... (2)
driver do repositorio debian nao atende o requisito minimo (7)
Como atribuir corretamente o CNES final baseado nas regras de certific... (3)